雖然在Linked List Explore Card 中也有提及雙指針演算法,當時是直接講了快慢指針算法,我們為了要判斷鏈結陣列中是否有環狀結構,使用的兩個指針都是從頭開始往前移動,而這邊給了另一個問題。
Reverse the elements in an array.
這個問題使用單指針的話會需要另外建立一個陣列,而使用雙指針就可以使用原地操作,如下面所展示的程式碼。
public void reverse(int[] array) {
int temp = 0;
for (int i = 0, j = array.length - 1; i < j; i++, j--) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
Given an array and a value, remove all instances of that value in-place and return the new length.
這又是先前有解過的問題,使用原地操作移除在陣列中的指定元素,與上一個問題一樣,如果使用單指針的話需要另外建立一個新的陣列,使用雙指針就可以節省空間。
public int removeElement(int[] nums, int val) {
int k = 0;
for (int i = 0; i < nums.length; ++i) {
if (nums[i] != val) {
nums[k] = nums[i];
k++;
}
}
return k;
}
其實上網查一下就有很多雙指針演算法的資料,根本不止Explore Card 寫的這些用法,不過Explore Card 也只是入門學習,要深入學習的話還是要多查多看多學。